package com.ror.domain;

import java.util.ArrayList;

public class Poker implements Comparable<Poker> {
    //所有数字
    private static final String[] numbers =
            {"2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3"};
    //用于获取贴图的所有数字代号
    public static final int[] numberAssetCodes = {2, 1, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3};
    //所有扑克牌
    private static final ArrayList<Poker> cards = new ArrayList<>();

    static {
        //备牌
        cards.add(new Poker(PokerColor.RED_JOKER, "JOKER", 101, 0, 2));
        cards.add(new Poker(PokerColor.BLACK_JOKER, "Joker", 100, 1, 1));
        int index = 2;
        int value = numbers.length - 1;
        for (int i = 0; i < numbers.length; i++) {
            for (PokerColor color : PokerColor.values()) {
                //排除鬼牌
                if (color.isJoker()) continue;
                cards.add(new Poker(color, numbers[i], value--, index++, numberAssetCodes[i]));
            }
        }
    }

    public static ArrayList<Poker> getCards() {
        return cards;
    }

    //用唯一标识数获取扑克牌对象
    public static Poker cardOf(int index) {
        return cards.get(index);
    }

    private PokerColor color;
    private String number;
    private int value; //扑克牌的价值
    //如果原始数据的规律非常复杂，我们可以先手动排序让每一个数据跟唯一的序号产生对应关系。
    //序号就是数字，规律非常简单，后续的所有操作，我们以序号为准。
    //当真正需要操作原始数据时候，再通过序号找到原始数据即可。
    private int index; //每张扑克牌的唯一标识数，也是它们在所有扑克牌中的索引，也是用于理牌的索引
    public int numberAssetCode; //用于获取贴图的数字代号

    public Poker(PokerColor color, String number, int value, int index, int numberAssetCode) {
        this.color = color;
        this.number = number;
        this.value = value;
        this.index = index;
        this.numberAssetCode = numberAssetCode;
    }

    /**
     * 获取花色
     *
     * @return color
     */
    public PokerColor getColor() {
        return color;
    }

    /**
     * 设置花色
     *
     * @param color 花色
     */
    public void setColor(PokerColor color) {
        this.color = color;
    }

    /**
     * 获取数字
     *
     * @return number
     */
    public String getNumber() {
        return number;
    }

    /**
     * 设置数字
     *
     * @param number 数字
     */
    public void setNumber(String number) {
        this.number = number;
    }

    /**
     * 获取价值
     *
     * @return value
     */
    public int getValue() {
        return value;
    }

    /**
     * 设置价值
     *
     * @param value 价值
     */
    public void setValue(int value) {
        this.value = value;
    }

    /**
     * 获取唯一标识数
     *
     * @return index
     */
    public int getIndex() {
        return index;
    }

    /**
     * 设置唯一标识数
     *
     * @param index 唯一标识数
     */
    public void setIndex(int index) {
        this.index = index;
    }

    public String toString() {
        return this.color.getEmoji() + this.number;
    }

    //自定义排序规则
    @Override
    public int compareTo(Poker o) {
        return this.index - o.index;
    }
}
